<!DOCTYPE html>
<html lang="zh-cn" class="noVNC_loading">
<head>

    <!--
    noVNC example: simple example using default UI
    Copyright (C) 2019 The noVNC authors
    noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
    This file is licensed under the 2-Clause BSD license (see LICENSE.txt).

    Connect parameters are provided in query string:
        http://example.com/?host=HOST&port=PORT&encrypt=1
    or the fragment:
        http://example.com/#host=HOST&port=PORT&encrypt=1
    -->
    <title>noVNC</title>

    <link rel="icon" type="image/x-icon" href="app/images/icons/novnc.ico">
    <meta name="theme-color" content="#313131">

    <!-- Apple iOS Safari settings -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">

    <!-- @2x -->
    <link rel="apple-touch-icon" sizes="40x40" type="image/png" href="app/images/icons/novnc-ios-40.png">
    <link rel="apple-touch-icon" sizes="58x58" type="image/png" href="app/images/icons/novnc-ios-58.png">
    <link rel="apple-touch-icon" sizes="80x80" type="image/png" href="app/images/icons/novnc-ios-80.png">
    <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-ios-120.png">
    <link rel="apple-touch-icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-ios-152.png">
    <link rel="apple-touch-icon" sizes="167x167" type="image/png" href="app/images/icons/novnc-ios-167.png">
    <!-- @3x -->
    <link rel="apple-touch-icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-ios-60.png">
    <link rel="apple-touch-icon" sizes="87x87" type="image/png" href="app/images/icons/novnc-ios-87.png">
    <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-ios-120.png">
    <link rel="apple-touch-icon" sizes="180x180" type="image/png" href="app/images/icons/novnc-ios-180.png">

    <!-- Stylesheets -->
    <link rel="stylesheet" href="app/styles/constants.css">
    <link rel="stylesheet" href="app/styles/base.css">
    <link rel="stylesheet" href="app/styles/input.css">
    
    <style>
        /* 聊天室消息提示动画 */
        @keyframes pulse {
            0% { transform: scale(1); opacity: 1; }
            50% { transform: scale(1.1); opacity: 0.8; }
            100% { transform: scale(1); opacity: 1; }
        }
        
        @keyframes slideInBounce {
            0% { transform: translateX(100%) translateY(-50%); opacity: 0; }
            60% { transform: translateX(-10px) translateY(-50%); opacity: 1; }
            80% { transform: translateX(5px) translateY(-50%); opacity: 1; }
            100% { transform: translateX(0) translateY(-50%); opacity: 1; }
        }
        
        @keyframes fadeInOut {
            0% { opacity: 0; }
            20% { opacity: 1; }
            80% { opacity: 1; }
            100% { opacity: 0; }
        }
        
        #noVNC_chat_notification {
            transition: all 0.3s ease;
        }
        
        #noVNC_chat_notification:hover {
            transform: scale(1.2);
        }
        
        /* 气泡提示样式 */
        #noVNC_chat_bubble {
            position: fixed;
            top: 20px;
            right: 20px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 15px 20px;
            border-radius: 12px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
            z-index: 10000;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            font-size: 14px;
            max-width: 300px;
            display: none;
            animation: slideInBounce 0.6s ease-out;
            cursor: pointer;
            transition: all 0.3s ease;
        }
        
        #noVNC_chat_bubble:hover {
            transform: translateY(-2px);
            box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
        }
        
        #noVNC_chat_bubble .username {
            font-weight: bold;
            color: #ffd700;
            margin-bottom: 5px;
        }
        
        #noVNC_chat_bubble .message {
            line-height: 1.4;
            margin-bottom: 8px;
        }
        
        #noVNC_chat_bubble .time {
            font-size: 12px;
            opacity: 0.8;
            text-align: right;
        }
        
        #noVNC_chat_bubble .close-btn {
            position: absolute;
            top: 5px;
            right: 5px;
            width: 20px;
            height: 20px;
            background: rgba(255, 255, 255, 0.2);
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            cursor: pointer;
            font-size: 12px;
        }
        
        #noVNC_chat_bubble .close-btn:hover {
            background: rgba(255, 255, 255, 0.3);
        }
        
        /* 多消息提示 */
        #noVNC_chat_bubble.multi-message {
            background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
        }
        
        #noVNC_chat_bubble.multi-message .message-count {
            background: rgba(255, 255, 255, 0.3);
            padding: 2px 8px;
            border-radius: 12px;
            font-size: 12px;
            font-weight: bold;
            display: inline-block;
            margin-bottom: 5px;
        }
        
        /* 小型浮动提示按钮 */
        #noVNC_chat_floating_btn {
            position: fixed;
            bottom: 20px;
            right: 20px;
            width: 45px;
            height: 45px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-radius: 50%;
            display: none;
            align-items: center;
            justify-content: center;
            cursor: pointer;
            box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
            z-index: 9999;
            transition: all 0.3s ease;
            animation: pulse 2s infinite;
        }
        
        #noVNC_chat_floating_btn:hover {
            transform: scale(1.1);
            box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4);
        }
        
        #noVNC_chat_floating_btn svg {
            width: 20px;
            height: 20px;
            fill: white;
        }
        
        #noVNC_chat_floating_btn .badge {
            position: absolute;
            top: -3px;
            right: -3px;
            background: #ff4444;
            color: white;
            border-radius: 50%;
            width: 18px;
            height: 18px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 10px;
            font-weight: bold;
            box-shadow: 0 2px 6px rgba(255, 68, 68, 0.5);
        }
    </style>

    <!-- Images that will later appear via CSS -->
    <link rel="preload" as="image" href="app/images/info.svg">
    <link rel="preload" as="image" href="app/images/error.svg">
    <link rel="preload" as="image" href="app/images/warning.svg">

    <script type="module" crossorigin="anonymous" src="app/error-handler.js"></script>

    <script type="module">
        import UI from "./app/ui.js";
        import * as Log from './core/util/logging.js';

        let response;

        let defaults = {};
        let mandatory = {};

        // Default settings will be loaded from defaults.json. Mandatory
        // settings will be loaded from mandatory.json, which the user
        // cannot change.

        try {
            response = await fetch('./defaults.json');
            if (!response.ok) {
                throw Error("" + response.status + " " + response.statusText);
            }

            defaults = await response.json();
        } catch (err) {
            Log.Error("Couldn't fetch defaults.json: " + err);
        }

        try {
            response = await fetch('./mandatory.json');
            if (!response.ok) {
                throw Error("" + response.status + " " + response.statusText);
            }

            mandatory = await response.json();
        } catch (err) {
            Log.Error("Couldn't fetch mandatory.json: " + err);
        }

        // You can also override any defaults you need here:
        //
        // defaults['host'] = 'vnc.example.com';

        // Or force a specific setting, preventing the user from
        // changing it:
        //
        // mandatory['view_only'] = true;

        // See docs/EMBEDDING.md for a list of possible settings.

        UI.start({ settings: { defaults: defaults,
                               mandatory: mandatory } });
    </script>
</head>

<body>

    <div id="noVNC_fallback_error" class="noVNC_center">
        <div>
            <div>noVNC encountered an error:</div>
            <br>
            <div id="noVNC_fallback_errormsg"></div>
        </div>
    </div>

    <!-- noVNC control bar -->
    <div id="noVNC_control_bar_anchor" class="noVNC_vcenter">

        <div id="noVNC_control_bar">
            <div id="noVNC_control_bar_handle" title="Hide/Show the control bar"><div></div></div>

            <div class="noVNC_scroll">

            <h1 class="noVNC_logo" translate="no"><span>no</span><br>VNC</h1>

            <hr>

            <!-- Drag/Pan the viewport -->
            <input type="image" alt="Drag" src="app/images/drag.svg"
                id="noVNC_view_drag_button" class="noVNC_button noVNC_hidden"
                title="Move/Drag viewport">

            <!--noVNC touch device only buttons-->
            <div id="noVNC_mobile_buttons">
                <input type="image" alt="Keyboard" src="app/images/keyboard.svg"
                    id="noVNC_keyboard_button" class="noVNC_button" title="Show keyboard">
            </div>

            <!-- Extra manual keys -->
            <input type="image" alt="Extra keys" src="app/images/toggleextrakeys.svg"
                id="noVNC_toggle_extra_keys_button" class="noVNC_button"
                title="Show extra keys">
            <div class="noVNC_vcenter">
            <div id="noVNC_modifiers" class="noVNC_panel">
                <input type="image" alt="Ctrl" src="app/images/ctrl.svg"
                    id="noVNC_toggle_ctrl_button" class="noVNC_button"
                    title="Toggle Ctrl">
                <input type="image" alt="Alt" src="app/images/alt.svg"
                    id="noVNC_toggle_alt_button" class="noVNC_button"
                    title="Toggle Alt">
                <input type="image" alt="Windows" src="app/images/windows.svg"
                    id="noVNC_toggle_windows_button" class="noVNC_button"
                    title="Toggle Windows">
                <input type="image" alt="Tab" src="app/images/tab.svg"
                    id="noVNC_send_tab_button" class="noVNC_button"
                    title="Send Tab">
                <input type="image" alt="Esc" src="app/images/esc.svg"
                    id="noVNC_send_esc_button" class="noVNC_button"
                    title="Send Escape">
                <input type="image" alt="Ctrl+Alt+Del" src="app/images/ctrlaltdel.svg"
                    id="noVNC_send_ctrl_alt_del_button" class="noVNC_button"
                    title="Send Ctrl-Alt-Del">
            </div>
            </div>

            <!-- Shutdown/Reboot -->
            <input type="image" alt="Shutdown/Reboot" src="app/images/power.svg"
                id="noVNC_power_button" class="noVNC_button"
                title="Shutdown/Reboot...">
            <div class="noVNC_vcenter">
            <div id="noVNC_power" class="noVNC_panel">
                <div class="noVNC_heading">
                    <img alt="" src="app/images/power.svg"> Power
                </div>
                <input type="button" id="noVNC_shutdown_button" value="Shutdown">
                <input type="button" id="noVNC_reboot_button" value="Reboot">
                <input type="button" id="noVNC_reset_button" value="Reset">
            </div>
            </div>

            <!-- Clipboard -->
            <input type="image" alt="Clipboard" src="app/images/clipboard.svg"
                id="noVNC_clipboard_button" class="noVNC_button"
                title="Clipboard">
            <div class="noVNC_vcenter">
            <div id="noVNC_clipboard" class="noVNC_panel">
                <div class="noVNC_heading">
                    <img alt="" src="app/images/clipboard.svg"> Clipboard
                </div>
                <p class="noVNC_subheading">
                    Edit clipboard content in the textarea below.
                </p>
                <textarea id="noVNC_clipboard_text" rows=5></textarea>
            </div>
            </div>

            <!-- Toggle fullscreen -->
            <input type="image" alt="Full screen" src="app/images/fullscreen.svg"
                id="noVNC_fullscreen_button" class="noVNC_button noVNC_hidden"
                title="Full screen">

            <!-- Settings -->
            <input type="image" alt="Settings" src="app/images/settings.svg"
                id="noVNC_settings_button" class="noVNC_button"
                title="Settings">
            <div class="noVNC_vcenter">
            <div id="noVNC_settings" class="noVNC_panel">
                <div class="noVNC_heading">
                    <img alt="" src="app/images/settings.svg"> Settings
                </div>
                <ul>
                    <li>
                        <label>
                            <input id="noVNC_setting_shared" type="checkbox"
                                   class="toggle">
                            Shared mode
                        </label>
                    </li>
                    <li>
                        <label>
                            <input id="noVNC_setting_view_only" type="checkbox"
                                   class="toggle">
                            View only
                        </label>
                    </li>
                    <li><hr></li>
                    <li>
                        <label>
                            <input id="noVNC_setting_view_clip" type="checkbox"
                                   class="toggle">
                            Clip to window
                        </label>
                    </li>
                    <li>
                        <label for="noVNC_setting_resize">Scaling mode:</label>
                        <select id="noVNC_setting_resize" name="vncResize">
                            <option value="off">None</option>
                            <option value="scale">Local scaling</option>
                            <option value="remote">Remote resizing</option>
                        </select>
                    </li>
                    <li><hr></li>
                    <li>
                        <div class="noVNC_expander">Advanced</div>
                        <div><ul>
                            <li>
                                <label for="noVNC_setting_quality">Quality:</label>
                                <input id="noVNC_setting_quality" type="range" min="0" max="9" value="6">
                            </li>
                            <li>
                                <label for="noVNC_setting_compression">Compression level:</label>
                                <input id="noVNC_setting_compression" type="range" min="0" max="9" value="2">
                            </li>
                            <li><hr></li>
                            <li>
                                <label for="noVNC_setting_repeaterID">Repeater ID:</label>
                                <input id="noVNC_setting_repeaterID" type="text" value="">
                            </li>
                            <li>
                                <div class="noVNC_expander">WebSocket</div>
                                <div><ul>
                                    <li>
                                        <label>
                                            <input id="noVNC_setting_encrypt" type="checkbox"
                                                   class="toggle">
                                            Encrypt
                                        </label>
                                    </li>
                                    <li>
                                        <label for="noVNC_setting_host">Host:</label>
                                        <input id="noVNC_setting_host">
                                    </li>
                                    <li>
                                        <label for="noVNC_setting_port">Port:</label>
                                        <input id="noVNC_setting_port" type="number">
                                    </li>
                                    <li>
                                        <label for="noVNC_setting_path">Path:</label>
                                        <input id="noVNC_setting_path" type="text" value="websockify">
                                    </li>
                                </ul></div>
                            </li>
                            <li><hr></li>
                            <li>
                                <label>
                                    <input id="noVNC_setting_reconnect" type="checkbox"
                                           class="toggle">
                                    Automatic reconnect
                                </label>
                            </li>
                            <li>
                                <label for="noVNC_setting_reconnect_delay">Reconnect delay (ms):</label>
                                <input id="noVNC_setting_reconnect_delay" type="number">
                            </li>
                            <li><hr></li>
                            <li>
                                <label>
                                    <input id="noVNC_setting_show_dot" type="checkbox"
                                           class="toggle">
                                    Show dot when no cursor
                                </label>
                            </li>
                            <li><hr></li>
                            <!-- Logging selection dropdown -->
                            <li>
                                <label>Logging:
                                    <select id="noVNC_setting_logging" name="vncLogging">
                                    </select>
                                </label>
                            </li>
                        </ul></div>
                    </li>
                    <li class="noVNC_version_separator"><hr></li>
                    <li class="noVNC_version_wrapper">
                        <span>Version:</span>
                        <span class="noVNC_version"></span>
                    </li>
                </ul>
            </div>
            </div>

            <!-- Chat Room Panel -->
            <div class="noVNC_vcenter">
            <div id="noVNC_chat" class="noVNC_panel" style="width: 350px;">
                <div class="noVNC_heading">
                    <img alt="" src="app/images/info.svg" style="filter: hue-rotate(200deg) saturate(1.5);"> 公共聊天室
                </div>
                <div id="noVNC_chat_messages" style="height: 200px; overflow-y: auto; border: 1px solid #ccc; padding: 10px; margin: 5px 0; background: #f9f9f9;">
                    <p style="color: #666; font-style: italic;">欢迎来到公共聊天室！</p>
                </div>
                <div style="margin: 5px 0;">
                    <input type="text" id="noVNC_chat_input" placeholder="输入消息..." 
                           style="width: 70%; padding: 5px; border: 1px solid #ccc; border-radius: 3px;">
                    <input type="button" id="noVNC_chat_send" value="发送" 
                           style="width: 25%; padding: 3px; font-size: 12px; background: #4CAF50; color: white; border: none; border-radius: 3px; cursor: pointer;">
                </div>
                <div class="button_row">
                    <input type="button" id="noVNC_chat_clear" value="清空" style="font-size: 12px; padding: 4px 8px;">
                    <input type="button" id="noVNC_chat_users" value="在线" style="font-size: 12px; padding: 4px 8px;">
                </div>
            </div>
            </div>

            <!-- File Management Panel -->
            <div class="noVNC_vcenter">
            <div id="noVNC_file_management" class="noVNC_panel">
                <div class="noVNC_heading">
                    <img alt="" src="app/images/file_management.svg"> 文件管理
                </div>
                
                <!-- 文件列表部分 -->
                <div style="margin: 10px 0;">
                    <div style="margin-bottom: 10px;">
                        <strong>保存路径:</strong> <span id="noVNC_file_path">/home/lroot/file</span>
                    </div>
                    <div style="height: 200px; overflow-y: auto; border: 1px solid #ccc; padding: 10px; background: #f9f9f9;">
                        <table id="noVNC_file_list" style="width: 100%; border-collapse: collapse;">
                            <thead>
                                <tr style="background: #f0f0f0;">
                                    <th style="border: 1px solid #ccc; padding: 5px; text-align: left;">文件名</th>
                                    <th style="border: 1px solid #ccc; padding: 5px; text-align: left; width: 80px;">大小</th>
                                    <th style="border: 1px solid #ccc; padding: 5px; text-align: center; width: 90px;">操作</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr>
                                    <td colspan="3" style="border: 1px solid #ccc; padding: 5px; text-align: center; color: #666;">
                                        正在加载文件列表...
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
                
                <!-- 文件操作部分 -->
                <div style="margin: 10px 0;">
                    <div style="margin: 5px 0; display: flex; align-items: center; gap: 5px;">
                        <input type="file" id="noVNC_file_input" style="flex: 1; padding: 5px; border: 1px solid #ccc; border-radius: 3px; font-size: 14px; display: none;">
                        <input type="text" id="noVNC_file_display" placeholder="选择文件" readonly 
                               style="flex: 1; padding: 5px; border: 1px solid #ccc; border-radius: 3px; font-size: 14px; background: #f9f9f9; cursor: pointer;">
                        <input type="button" id="noVNC_select_file_button" value="选择" 
                               style="width: 50px !important; height: 35px !important; padding: 0 !important; background: #FF9800; color: white; border: none !important; border-radius: 3px; cursor: pointer; font-size: 12px; margin: 0; min-width: 50px; max-width: 50px; min-height: 35px; max-height: 35px; box-sizing: border-box;">
                        <input type="button" id="noVNC_upload_button" value="上传" 
                               style="width: 50px !important; height: 35px !important; padding: 0 !important; background: #4CAF50; color: white; border: none !important; border-radius: 3px; cursor: pointer; font-size: 12px; margin: 0; min-width: 50px; max-width: 50px; min-height: 35px; max-height: 35px; box-sizing: border-box;">
                    </div>
                    <div id="noVNC_upload_progress" style="display: none; margin: 5px 0;">
                        <div style="background: #f0f0f0; border-radius: 3px; height: 20px; overflow: hidden;">
                            <div id="noVNC_upload_progress_bar" style="background: #4CAF50; height: 100%; width: 0%; transition: width 0.3s;"></div>
                        </div>
                        <div id="noVNC_upload_status" style="font-size: 12px; color: #666; margin-top: 2px;"></div>
                    </div>
                </div>
            </div>
            </div>

            <!-- Permission Management Panel -->
            <div class="noVNC_vcenter">
            <div id="noVNC_permission" class="noVNC_panel">
                <div class="noVNC_heading">
                    <img alt="" src="app/images/permission_management.svg"> 权限管理
                </div>
                <div class="noVNC_subheading">
                    管理在线用户权限
                </div>
                <div id="noVNC_user_list">
                    <p>正在加载用户列表...</p>
                </div>
                <div class="button_row">
                    <input type="button" id="noVNC_refresh_users_button" value="刷新用户">
                    <input type="button" id="noVNC_kick_user_button" value="踢出用户">
                </div>
            </div>
            </div>

            <hr>

            <!-- Connection controls -->
            <input type="image" alt="Disconnect" src="app/images/disconnect.svg"
                id="noVNC_disconnect_button" class="noVNC_button"
                title="断开连接">

            <!-- Chat Room button with notification -->
            <input type="image" alt="Chat Room" src="app/images/info.svg"
                id="noVNC_chat_button" class="noVNC_button"
                title="公共聊天室" style="filter: hue-rotate(200deg) saturate(1.5); position: relative;">
            <span id="noVNC_chat_notification" style="display: none; background: #ff4444; color: white; border-radius: 50%; width: 12px; height: 12px; font-size: 10px; text-align: center; line-height: 12px; position: absolute; top: -5px; right: -5px; z-index: 1000; pointer-events: none;">!</span>

            <!-- File Management button -->
            <input type="image" alt="File Management" src="app/images/file_management.svg"
                id="noVNC_file_management_button" class="noVNC_button"
                title="文件管理">

            <!-- Permission Management button (admin only) -->
            <input type="image" alt="Permission Management" src="app/images/permission_management.svg"
                id="noVNC_permission_button" class="noVNC_button noVNC_hidden"
                title="权限管理">

            <!-- Admin Management button (admin only) -->
            <input type="image" alt="Admin Management" src="app/images/keyboard.svg"
                id="noVNC_admin_management_button" class="noVNC_button noVNC_hidden"
                title="后台管理" style="filter: hue-rotate(270deg) saturate(1.5);">

            <!-- Logout button -->
            <input type="image" alt="Logout" src="app/images/power.svg"
                id="noVNC_logout_button" class="noVNC_button"
                title="退出登录" style="filter: hue-rotate(180deg);">

            </div>
        </div>

    </div> <!-- End of noVNC_control_bar -->

    <div id="noVNC_hint_anchor" class="noVNC_vcenter">
        <div id="noVNC_control_bar_hint">
        </div>
    </div>

    <!-- Status dialog -->
    <div id="noVNC_status"></div>

    <!-- Connect button -->
    <div class="noVNC_center">
        <div id="noVNC_connect_dlg">
            <p class="noVNC_logo" translate="no"><span>no</span>VNC</p>
            <div>
                <button id="noVNC_connect_button">
                    <img alt="" src="app/images/connect.svg"> Connect
                </button>
            </div>
        </div>
    </div>

    <!-- Server key verification dialog -->
    <div class="noVNC_center noVNC_connect_layer">
    <div id="noVNC_verify_server_dlg" class="noVNC_panel"><form>
        <div class="noVNC_heading">
            Server identity
        </div>
        <div>
            The server has provided the following identifying information:
        </div>
        <div id="noVNC_fingerprint_block">
            Fingerprint:
            <span id="noVNC_fingerprint"></span>
        </div>
        <div>
            Please verify that the information is correct and press
            "Approve". Otherwise press "Reject".
        </div>
        <div class="button_row">
            <input id="noVNC_approve_server_button" type="submit" value="Approve">
            <input id="noVNC_reject_server_button" type="button" value="Reject">
        </div>
    </form></div>
    </div>

    <!-- Password dialog -->
    <div class="noVNC_center noVNC_connect_layer">
    <div id="noVNC_credentials_dlg" class="noVNC_panel"><form>
        <div class="noVNC_heading">
            Credentials
        </div>
        <div id="noVNC_username_block">
            <label for="noVNC_username_input">Username:</label>
            <input id="noVNC_username_input">
        </div>
        <div id="noVNC_password_block">
            <label for="noVNC_password_input">Password:</label>
            <input id="noVNC_password_input" type="password">
        </div>
        <div class="button_row">
            <input id="noVNC_credentials_button" type="submit" value="Send credentials">
        </div>
    </form></div>
    </div>

    <!-- Transition screens -->
    <div id="noVNC_transition">
        <div id="noVNC_transition_text"></div>
        <div>
        <input type="button" id="noVNC_cancel_reconnect_button" value="Cancel">
        </div>
        <div class="noVNC_spinner"></div>
    </div>

    <!-- This is where the RFB elements will attach -->
    <div id="noVNC_container">
        <!-- Note that Google Chrome on Android doesn't respect any of these,
             html attributes which attempt to disable text suggestions on the
             on-screen keyboard. Let's hope Chrome implements the ime-mode
             style for example -->
        <textarea id="noVNC_keyboardinput" autocapitalize="off"
            autocomplete="off" spellcheck="false" tabindex="-1"></textarea>
    </div>

    <audio id="noVNC_bell">
        <source src="app/sounds/bell.oga" type="audio/ogg">
        <source src="app/sounds/bell.mp3" type="audio/mpeg">
    </audio>

    <!-- 聊天室气泡提示 -->
    <div id="noVNC_chat_bubble">
        <div class="close-btn" onclick="document.getElementById('noVNC_chat_bubble').style.display='none'">×</div>
        <div class="username"></div>
        <div class="message"></div>
        <div class="time"></div>
    </div>

    <!-- 小型浮动聊天按钮 -->
    <div id="noVNC_chat_floating_btn" onclick="document.getElementById('noVNC_chat_button').click()">
        <svg viewBox="0 0 24 24" fill="white">
            <path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"/>
        </svg>
        <div class="badge" style="display: none;">0</div>
    </div>


 </body>
</html>
